#ifndef CLIENT_H
#define CLIENT_H

#ifndef CLIENT_BUFSZ
#define CLIENT_BUFSZ 4096
#endif

/**
 * @file client.h
 * @author Leonardo Guilherme de Freitas
 * @brief Clientes com buffers de entrada e saida
 * 
 * Os buffers de entrada (read buffers) sao preenchidos
 * pelo servidor. O que tiver no buffer de escrita, eh enviado
 * pelo servidor.
 */

#include <stdlib.h>

#ifdef USE_THREADS
#include <pthread.h>
#endif

typedef struct client_t
{
  unsigned int id; /*! @brief id do cliente */
  
  void *input; /*! @brief buffer de entrada */
  size_t inputsz; /*! @brief tamanho do buffer de entrada */
  size_t inputlen; /*! @brief tamanho dos dados de entrada preenchidos */
  size_t read; /*! @brief quantidade de dados efetivamente lidos/processados */

  void *output; /*! @brief buffer de saida */
  size_t outputsz; /*! @brief tamanho total do buffer de saida */
  size_t outputlen; /*! @brief tamanho total dos dados de saida preenchidos */
  size_t sent; /*! @brief tamanho dos dados enviados */
  
  size_t apperture; /*! @brief controle de dados por frame */
  unsigned char frame; /*! @brief contador de frame */
  
  
#ifdef USE_THREADS  
  pthread_mutex_t lock;
#endif
  
  void * data; /*! @brief ponteiros privados */
  
  struct client_t *next, *prev; /* proximo cliente */
} client;


#endif